package br.com.jk.usuario;

import br.com.jk.usuario.permissoes.Permissao;
import br.com.jk.usuario.permissoes.Regra.Regras;
import br.com.jk.usuario.permissoes.PermissaoRn;
import br.com.jk.util.DaoFactory;
import br.com.jk.util.RNException;
import br.com.jk.util.pesquisa.Pesquisa.Opcao;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;

/**
 *
 * @author camilo
 */
public class UsuarioRn {

  private UsuarioDao dao;

  public UsuarioRn() {
    this.dao = DaoFactory.criarUsuarioDao();
  }

  public void salvar(Usuario user) {
    int tempId = user.getId();
    this.dao.salvar(user);
    if (tempId == 0) {
      for (Regras regra : Regras.values()) {
        PermissaoRn permissaoRn = new PermissaoRn();
        Permissao permissao = new Permissao();
        permissao.setHabilitado(false);
        permissao.setUsuario(user);
//        permissao.setRegra(regra);
        permissaoRn.salvar(permissao);
      }
    }
  }

  public List<Usuario> listar() {
    return this.dao.listar();
  }

  public List<Usuario> pesquisaPadrao(String property, String criterio, Opcao opcao) {
    return this.dao.pesquisaPadrao(property, criterio, opcao);
  }

  public List<Usuario> pesquisaPadrao(String property, int criterio, Opcao opcao) {
    return this.dao.pesquisaPadrao(property, criterio, opcao);
  }

  public Usuario carregar(int id) {
    return this.dao.carregar(id);
  }

  public Usuario carregarCod(String cod) {
    return this.dao.carregarCod(cod);
  }

  public void excluir(Usuario forn) {
    this.dao.excluir(forn);
  }

  public Usuario carregarNome(String nome) {
    return this.dao.carregarNome(nome);
  }

  public byte[] criptografar(String senha) throws RNException {
    try {
      MessageDigest algorithm = MessageDigest.getInstance("SHA-256");
      return algorithm.digest(senha.getBytes("UTF-8"));
    } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
      throw new RNException("Erro ao criptografar a senha", e);
    }
  }

  public String getSenhaCriptografada(byte messageDigest[]) {
    StringBuilder hexString = new StringBuilder();
    for (byte b : messageDigest) {
      hexString.append(String.format("%02X", 0xFF & b));
    }
    return hexString.toString();
  }

  public Boolean compararSenha(String senha, Usuario usuario) throws RNException {
    byte messageDigest[] = criptografar(senha);
    String senhaFornecida = getSenhaCriptografada(messageDigest);

    String senhaBd = getSenhaCriptografada(usuario.getSenha());

    if (senhaBd.equals(senhaFornecida)) {
      return true;
    }
    return false;
  }
}
